package sistema;

import controloBD.AcessoBD;
import controloBD.QueryResult;
import java.util.Hashtable;
import java.util.Vector;

public class Utilizador {

    private Long id_utilizador;
    private String nome;
    private String apelido;
    private String dataNascimento; // a rever se mudamos para tipo Date
    private String morada;
    private String localidade;
    private String codPostal;
    private String telefone;
    private String email;
    private String password;
    private String perfil;
    private String bi;
    private Double saldo;

    public Utilizador(Long id, String nome, String apelido, String dataNascimento, String morada, String localidade, String codPostal, String telefone,
            String email, String password, String perfil, String bi, Double saldo) {
        this.id_utilizador = id;
        this.nome = nome;
        this.apelido = apelido;
        this.dataNascimento = dataNascimento;
        this.morada = morada;
        this.localidade = localidade;
        this.codPostal = codPostal;
        this.telefone = telefone;
        this.email = email;
        this.password = password;
        this.perfil = perfil;
        this.saldo = saldo;
    }

    /**
     *
     * @param tabela
     * constroi um utilizador a partir do vector
     */
    public Utilizador(Vector tabela) {
        this.id_utilizador = (Long) tabela.get(0);
        this.nome = (String) tabela.get(1);
        this.apelido = (String) tabela.get(2);
        this.dataNascimento = (String) tabela.get(3);
        this.morada = (String) tabela.get(4);
        this.localidade = (String) tabela.get(5);
        this.codPostal = (String) tabela.get(6);
        this.telefone = (String) tabela.get(7);
        this.email = (String) tabela.get(8);
        this.password = (String) tabela.get(9);
        this.perfil = (String) tabela.get(10);
        this.bi = (String) tabela.get(11);
        this.saldo = (Double) tabela.get(12);
    }

    public static void insere(Hashtable<String, String> params) throws Exception {
        // abre uma conexao a bd
        AcessoBD conexao = new AcessoBD();
        String qryName = "inserir_utilizador";
        conexao.executeUpdate(qryName, params);
        conexao.closeBD();
    }

    /**
     * @param params
     * @throws SQLException
     */
    public static void altera(Hashtable<String, String> params) throws Exception {
        // abre uma conexao a bd
        AcessoBD conexao = new AcessoBD();
        String qryName = "altera_utilizador";
        conexao.executeUpdate(qryName, params);
        conexao.closeBD();
    }

    public static Utilizador devolvePorId(Long id_utilizador) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_idutilizador", id_utilizador.toString());
        String qryName = "devolve_utilizador";
        QueryResult qr = conexao.executeSelect(qryName, dados);
        conexao.closeBD();
        return new Utilizador(qr.tabela());
    }

    public static Utilizador devolvePorEmail(String email) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_email", email);
        String qryName = "devolve_por_email";
        QueryResult qr = conexao.executeSelect(qryName, dados);
        conexao.closeBD();
        return new Utilizador(qr.tabela());
    }

    public static boolean eValida(String email, String password) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_email", email);
        dados.put("var_password", password);
        String qryName = "password_email_validos";
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dados);
        conexao.closeBD();
        return !qr.tabela().isEmpty();
    }

    public static boolean existeEmail(String email) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_email", email);
        String qryName = "existe_email";
        QueryResult qr = new QueryResult();
        qr = conexao.executeSelect(qryName, dados);
        conexao.closeBD();
        return !qr.tabela().isEmpty();
    }

    public static void insereTransaccao(Hashtable<String, String> params) throws Exception {
        AcessoBD conexao = new AcessoBD();
        String qryName = "inserir_nova_transaccao";
        conexao.executeUpdate(qryName, params);
        conexao.closeBD();
    }

    public static void actualizaSaldo(Double saldo) throws Exception{
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_saldo", saldo.toString());
        String qryName = "actualiza_saldo";
        conexao.executeUpdate(qryName, dados);
        conexao.closeBD();
    }

    public static Double devolveSaldo(Long id_utilizador) throws Exception {
        AcessoBD conexao = new AcessoBD();
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_idutilizador", id_utilizador.toString());
        String qryName = "devolve_saldo";
        QueryResult qr = conexao.executeSelect(qryName, dados);
        conexao.closeBD();
        return (new Utilizador(qr.tabela())).getSaldo();
    }

    public Long getId_utilizador() {
        return id_utilizador;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getApelido() {
        return apelido;
    }

    public void setApelido(String apelido) {
        this.apelido = apelido;
    }

    public String getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(String dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getMorada() {
        return morada;
    }

    public void setMorada(String morada) {
        this.morada = morada;
    }

    public String getLocalidade() {
        return localidade;
    }

    public void setLocalidade(String localidade) {
        this.localidade = localidade;
    }

    public String getCodPostal() {
        return codPostal;
    }

    public void setCodPostal(String codPostal) {
        this.codPostal = codPostal;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPerfil() {
        return perfil;
    }

    public String getBi() {
        return bi;
    }

    public Double getSaldo() {
        return saldo;
    }
}
